// 查找数组

const arr = [ 10, 20, 40, 50, 60, 50, 60, 50, 70, 80 ];

let key = 30;
// Array.prototype.indexOf( key [, fromIndex ] )
let index = arr.indexOf( key );
console.log( index ); // -1

key = 50;
index = arr.indexOf( key );
console.log( index ); // 3

index = arr.indexOf( key, 4 );
console.log( index ); // 5

// Array.prototype.lastIndexOf( key [, fromIndex ] )
let last = arr.lastIndexOf( key );
console.log( last ); // 7

last = arr.lastIndexOf( key, 4 );
console.log( last ); // 3

// Array.prototype.includes( key [, fromIndex ] )
let exists = arr.includes(key);
console.log( exists );

exists = arr.includes(key, 8 );
console.log( exists );

console.log( '= '.repeat(20) );

const students = [
    { id: 9527, name: '华安', gender: '男' },
    { id: 8526, name: '秋香', gender: '女' },
    { id: 1024, name: '华文', gender: '男' },
    { id: 2048, name: '华武', gender: '男' },
    { id: 7777, name: '武状元', gender: '男' },
    { id: 6666, name: '石榴姐', gender: '女' }
];

let check = function(element, index, array){
    console.log( element, index, array === students );
    return element.gender === '女';
}

// Array.prototype.findIndex( callback [, thisArg] )
// 作用: 返回数组中满足测试函数(callback)的第一个元素的索引。若没有找到对应元素则返回 -1。
// 其中 callback 是个回调函数(即在findIndex内部会调用callback去检查每个元素)
// 需要注意的是 callback 函数可以有三个参数: element, index, array
// 在 findIndex 内部调用 callback 函数时会依次为其传入相应的参数
let result = students.findIndex( check );
console.log( result );

console.log( '- '.repeat(20) );

// Array.prototype.find( callback [, thisArg] )
// 作用: 返回数组中满足测试函数(callback)的第一个元素的值。否则返回 undefined。
let stu = students.find( check );
console.log( stu );

// 总结:
// Array.prototype.indexOf( key [, fromIndex ] )
// Array.prototype.lastIndexOf( key [, fromIndex ] )
// Array.prototype.includes( key [, fromIndex ] )
// Array.prototype.findIndex( callback [, thisArg ] )
// Array.prototype.find( callback [, thisArg ] )

// 动态为 Array.prototype 新增方法
Array.prototype.sousuo = function( callback ) {
    // 此时 this 表示当前数组实例(即通过那个数组来调用sousuo方法那个对象就是this)
    for(let i = 0 ; i < this.length; i++ ){
        let element = this[i];
        // 调用 callback 检查每个元素，请务必注意传入的实参
        if( callback( element, i, this ) ) {
            return element;
        }
    }
}

// 通过数组实例调用我们为数组原型扩展的新方法
let res = students.sousuo( check );
console.log( res );